# file: jugadores.py
# -*- coding: utf-8 -*-
from random import randrange,choice

class Jugador(object):
        '''Clase Jugador'''
        def __init__(self):
                '''Constructor de la clase Jugador'''
                self.nombre="jugador"
                self.descripcion=""
                self.autor=""
                self.lista_criaturas=[]
        def __str__(self):
                return "Nombre: "+ str(self.nombre)+";  Descripción: "+ str(self.descripcion)+";  Autor: "+ str(self.autor)
        def agregar_criatura(self,criatura):
                '''Agrega una criatura a la lista del jugador'''
                self.lista_criaturas.append(criatura)
        def eliminar_criatura(self,criatura):
                '''Elimina una criatura de la lista del jugador'''
                indice = self.lista_criaturas.index(criatura)
                del self.lista_criaturas[indice]
        def elegir_criatura(self):
                '''Devuelve una criatura'''
                if self.lista_criaturas == []:
                        return None
                else:
                        opcion_criatura=input("Ingrese el numero de criatura que desea elegir para el combate: ")
                        while opcion_criatura<1 or opcion_criatura>len(self.lista_criaturas) or(not isinstance(opcion_criatura,int)):
                                opcion_criatura=input("Ingrese el numero de criatura que desea elegir para el combate: ")
                return self.lista_criaturas[opcion_criatura-1]
        def elegir_accion(self,origen,destino):
                '''Devuelve una habilidad y el destino de dicha habilidad'''
                habilidades_criatura=origen.obtener_habilidades()
                opcion_habilidad=raw_input("Ingrese el nombre de la habilidad que desee usar: ")
                while opcion_habilidad not in habilidades_criatura:
                        opcion_habilidad=raw_input("Ingrese el nombre de otra habilidad que desee usar: ")
                caracteristicas_criatura=origen.obtener_estado()
                costos=habilidades_criatura[opcion_habilidad].obtener_costos()
                while ("mp" in costos and caracteristicas_criatura["mp"] < costos["mp"]) or ("hp" in costos and caracteristicas_criatura["hp"] < costos["hp"]):
                        opcion_habilidad=raw_input("No posee las caracteristicas suficientes para usar esta habilidad. Ingrese el nombre de otra habilidad que desee usar: ")
                        costos=habilidades_criatura[opcion_habilidad].obtener_costos()
                return habilidades_criatura[opcion_habilidad],destino
        def ver_criaturas(self):
                '''Devuelve la lista de criaturas del jugador'''
                return self.lista_criaturas

class IA_random():
        '''Clase IA_random'''
        def __init__(self):
                '''Constructor de la clase IA_random'''
                self.nombre="IA_random"
                self.descripcion=""
                self.autor=""
                self.lista_criaturas=[]
        def __str__(self):
                return "Nombre: "+str(self.nombre)+";  Descripción: "+str(self.descripcion)+";  Autor: "+str(self.autor)
        def agregar_criatura(self,criatura):
                '''Agrega una criatura a la lista del jugador'''
                self.lista_criaturas.append(criatura)
        def eliminar_criatura(self,criatura):
                '''Elimina una criatura de la lista del jugador'''
                indice = self.lista_criaturas.index(criatura)
                del self.lista_criaturas[indice]
        def elegir_criatura(self):
                '''Devuelve una criatura'''
                if self.lista_criaturas == []:
                        return None
                else:
                        aux=randrange(0,len(self.lista_criaturas))
                        return self.lista_criaturas[aux]
        def elegir_accion(self,origen,destino):
                '''Devuelve una habilidad y el destino de dicha habilidad'''
                lista_habilidades=[]
                habilidades_criatura=origen.obtener_habilidades()
                caracteristicas_criatura=origen.obtener_estado()
                for habilidad in habilidades_criatura:
                        lista_habilidades.append(habilidad)
                opcion_habilidad=choice(lista_habilidades)
                costos=habilidades_criatura[opcion_habilidad].obtener_costos()
                while ("mp" in costos and caracteristicas_criatura["mp"] < costos["mp"]) or ("hp" in costos and caracteristicas_criatura["hp"] < costos["hp"]):
                        opcion_habilidad=choice(lista_habilidades)
                        costos=habilidades_criatura[opcion_habilidad].obtener_costos()          
                        return opcion_habilidad,destino
                return opcion_habilidad,destino
        def ver_criaturas(self):
                '''Devuelve la lista de criaturas del jugador'''
                return self.lista_criaturas

               
class IA_inteligente():
        '''Clase IA_inteligente'''
        def __init__(self):
                '''Constructor de la clase IA_random'''
                self.nombre="IA_inteligente"
                self.descripcion=""
                self.autor=""
                self.lista_criaturas=[]
        def __str__(self):
                return "Nombre: "+str(self.nombre)+";  Descripción: "+str(self.descripcion)+";  Autor: "+str(self.autor)
        def agregar_criatura(self,criatura):
                '''Agrega una criatura a la lista del jugador'''
                self.lista_criaturas.append(criatura)
        def eliminar_criatura(self,criatura):
                '''Elimina una criatura de la lista del jugador'''
                indice=self.lista_criaturas.index(criatura)
                del self.lista_criaturas[indice]
        def elegir_criatura(self):
                '''Devuelve una criatura'''
                if self.lista_criaturas == []:
                        return None
                else:
                        aux=0
                        dicc1=self.lista_criaturas[aux].obtener_estado()
                        for i in range(len(self.lista_criaturas) -1):
                                dicc2=self.lista_criaturas[i+1].obtener_estado()
                                if dicc1["hp"]<dicc2["hp"]:
                                        aux=i+1
                                        dicc1=dicc2
                return self.lista_criaturas[aux]
        def elegir_accion(self,origen,destino):
                '''Devuelve una habilidad y el destino de dicha habilidad'''
                lista_habilidades=[]
                habilidades_no_disponibles=[]
                habilidades_disponibles=[]
                danos_total=0
                perdidas_total=0
                relacion_max=0
                opcion_habilidad="None"
                habilidades_criatura=origen.obtener_habilidades()
                caracteristicas_criatura=origen.obtener_estado()
                for habilidad in habilidades_criatura:
                        costos=habilidades_criatura[habilidad].obtener_costos()
                        for atributo in costos:
                                if costos[atributo]>caracteristicas_criatura[atributo]:
                                        habilidades_no_disponibles.append(habilidad)
                        if not habilidad in habilidades_no_disponibles:
                                habilidades_disponibles.append(habilidad)
                if habilidades_disponibles != None:
                        for habilidad in habilidades_disponibles:
                                consecuencias_origen,consecuencias_destino=habilidades_criatura[habilidad].obtener_consecuencias(origen,destino)
                                for dano_destino in consecuencias_destino:
                                        danos_total+=consecuencias_destino[dano_destino]
                                for perdida_origen in consecuencias_origen:
                                        perdidas_total+=consecuencias_origen[perdida_origen]
                                if perdidas_total == 0:
                                        perdidas_total+=1
                                relacion_danos_perdidas=danos_total/perdidas_total
                                if relacion_danos_perdidas>relacion_max:
                                        opcion_habilidad=habilidad
                                        relacion_max=relacion_danos_perdidas
                                elif opcion_habilidad=="None":
                                        opcion_habilidad=habilidad
                        return opcion_habilidad,destino
                else:
                        return None
        def ver_criaturas(self):
                '''Devuelve la lista de criaturas del jugador'''
                return self.lista_criaturas

